package com.zenithmind.version.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.version.pojo.domain.MergeRequest;
import com.zenithmind.version.pojo.dto.MergeRequestCreateDTO;
import com.zenithmind.version.pojo.dto.MergeRequestUpdateDTO;
import com.zenithmind.version.pojo.query.MergeRequestQueryDTO;
import com.zenithmind.version.pojo.vo.MergeRequestVO;

import java.util.List;

/**
 * 合并请求服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface MergeRequestService extends IService<MergeRequest> {

    /**
     * 创建合并请求
     * 
     * @param createDTO 创建信息
     * @return 合并请求信息
     */
    MergeRequestVO createMergeRequest(MergeRequestCreateDTO createDTO);

    /**
     * 更新合并请求
     * 
     * @param id 合并请求ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateMergeRequest(String id, MergeRequestUpdateDTO updateDTO);

    /**
     * 删除合并请求
     * 
     * @param id 合并请求ID
     * @return 是否成功
     */
    Boolean deleteMergeRequest(String id);

    /**
     * 分页查询合并请求
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<MergeRequestVO> getMergeRequestPage(MergeRequestQueryDTO queryDTO);

    /**
     * 获取合并请求详情
     * 
     * @param id 合并请求ID
     * @return 合并请求详情
     */
    MergeRequestVO getMergeRequestDetail(String id);

    /**
     * 获取仓库的合并请求列表
     * 
     * @param repositoryId 仓库ID
     * @param status 状态
     * @param limit 限制数量
     * @return 合并请求列表
     */
    List<MergeRequestVO> getRepositoryMergeRequests(String repositoryId, Integer status, Integer limit);

    /**
     * 获取用户创建的合并请求
     * 
     * @param authorId 作者ID
     * @param status 状态
     * @param limit 限制数量
     * @return 合并请求列表
     */
    List<MergeRequestVO> getUserMergeRequests(String authorId, Integer status, Integer limit);

    /**
     * 获取指派给用户的合并请求
     * 
     * @param assigneeId 指派人ID
     * @param status 状态
     * @param limit 限制数量
     * @return 合并请求列表
     */
    List<MergeRequestVO> getAssignedMergeRequests(String assigneeId, Integer status, Integer limit);

    /**
     * 检查合并冲突
     * 
     * @param repositoryId 仓库ID
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @return 冲突信息
     */
    Object checkMergeConflicts(String repositoryId, String sourceBranch, String targetBranch);

    /**
     * 获取合并请求的文件变更
     * 
     * @param mergeRequestId 合并请求ID
     * @return 文件变更列表
     */
    List<Object> getMergeRequestChanges(String mergeRequestId);

    /**
     * 获取合并请求的提交列表
     * 
     * @param mergeRequestId 合并请求ID
     * @return 提交列表
     */
    List<Object> getMergeRequestCommits(String mergeRequestId);

    /**
     * 执行合并
     * 
     * @param mergeRequestId 合并请求ID
     * @param userId 用户ID
     * @return 合并结果
     */
    Object executeMerge(String mergeRequestId, String userId);

    /**
     * 关闭合并请求
     * 
     * @param mergeRequestId 合并请求ID
     * @param userId 用户ID
     * @param reason 关闭原因
     * @return 是否成功
     */
    Boolean closeMergeRequest(String mergeRequestId, String userId, String reason);

    /**
     * 重新打开合并请求
     * 
     * @param mergeRequestId 合并请求ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean reopenMergeRequest(String mergeRequestId, String userId);

    /**
     * 添加审核者
     * 
     * @param mergeRequestId 合并请求ID
     * @param reviewerId 审核者ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean addReviewer(String mergeRequestId, String reviewerId, String userId);

    /**
     * 移除审核者
     * 
     * @param mergeRequestId 合并请求ID
     * @param reviewerId 审核者ID
     * @return 是否成功
     */
    Boolean removeReviewer(String mergeRequestId, String reviewerId);

    /**
     * 提交审核意见
     * 
     * @param mergeRequestId 合并请求ID
     * @param userId 用户ID
     * @param status 审核状态
     * @param comment 审核意见
     * @return 是否成功
     */
    Boolean submitReview(String mergeRequestId, String userId, Integer status, String comment);

    /**
     * 获取合并请求的审核记录
     * 
     * @param mergeRequestId 合并请求ID
     * @return 审核记录
     */
    List<Object> getMergeRequestReviews(String mergeRequestId);

    /**
     * 搜索合并请求
     * 
     * @param keyword 关键词
     * @param repositoryId 仓库ID
     * @param status 状态
     * @param limit 限制数量
     * @return 合并请求列表
     */
    List<MergeRequestVO> searchMergeRequests(String keyword, String repositoryId, Integer status, Integer limit);

    /**
     * 获取合并请求统计
     * 
     * @param repositoryId 仓库ID
     * @return 统计信息
     */
    Object getMergeRequestStatistics(String repositoryId);

    /**
     * 获取用户合并请求统计
     * 
     * @param userId 用户ID
     * @return 统计信息
     */
    Object getUserMergeRequestStatistics(String userId);

    /**
     * 自动合并检查
     * 
     * @param mergeRequestId 合并请求ID
     * @return 是否可以自动合并
     */
    Boolean canAutoMerge(String mergeRequestId);

    /**
     * 获取合并预览
     * 
     * @param repositoryId 仓库ID
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @return 合并预览
     */
    Object getMergePreview(String repositoryId, String sourceBranch, String targetBranch);

    /**
     * 解决合并冲突
     * 
     * @param mergeRequestId 合并请求ID
     * @param conflictResolutions 冲突解决方案
     * @param userId 用户ID
     * @return 解决结果
     */
    Object resolveMergeConflicts(String mergeRequestId, Object conflictResolutions, String userId);
}
